using System;
using System.Collections.Generic;
using System.Linq;
using TCC.ControleFluxoDeCaixa.Model.Contas;
using TCC.ControleFluxoDeCaixa.Model.Fluxo;
using TCC.ControleFluxoDeCaixa.Model.Relatorios;

namespace TCC.ControleFluxoDeCaixa.Apresentacao.ViewModels.DashBoard
{
    public class ContaResumo
    {
        public ContaFinanceira Conta { get; private set; }
        public decimal Saldo { get; private set; }
        public decimal ProximosLancamentosTotal { get; set; }

        public ContaResumoExtratoMensal[] Extratos { get; private set; }

        public RelatorioDeFluxoFinanceiro FluxoFinanceiro { get; private set; }

        public ContaResumo(ContaResumoExtratoMensal[] extratos, ContaFinanceira conta, decimal saldo, decimal proximosLancamentos, RelatorioDeFluxoFinanceiro fluxoFinanceiro)
        {
            Extratos = extratos;
            Conta = conta;
            Saldo = saldo;
            ProximosLancamentosTotal = proximosLancamentos;
            FluxoFinanceiro = fluxoFinanceiro;
        }
    }

    public class ContaResumoExtratoMensal
    {
        public int Ano { get;private set; }
        public int Mes { get;private set; }


        public string AnoMes
        {
            get
            {
                return Ano + "/" + Mes.ToString("00");
            }
        }

        private IEnumerable<Movimento> _movimentos;

        public IEnumerable<Movimento> LancamentosOcorridos
        {
            get
            {
                return _movimentos.OrderBy(m=> m.DataDoMovimento).ToArray();
            }
        }

        public Dictionary<Categoria, decimal> DespesasPorCategoria
        {
            get
            {
                return _movimentos.Where(m=> m.TipoDeMovimento == TipoDeMovimento.Despesa).GroupBy(m => m.Lancamento.Categoria)
                    .ToDictionary(k => k.Key, v => v.Sum(m => m.Valor));
            }
        }
        public Dictionary<Categoria, decimal> ReceitasPorCategoria
        {
            get
            {
                return _movimentos.Where(m => m.TipoDeMovimento == TipoDeMovimento.Receita).GroupBy(m => m.Lancamento.Categoria)
                    .ToDictionary(k => k.Key, v => v.Sum(m => m.Valor));
            }
        }

        public ContaResumoExtratoMensal(int ano, int mes, Movimento[] movimentos,DiaFluxo[] fluxo)
        {
            Ano = ano;
            Mes = mes;
            _movimentos = movimentos.ToArray();
            Fluxo = fluxo;
        }

        public IEnumerable<DiaFluxo> Fluxo {  get; private set; }

        public override string ToString()
        {
            return AnoMes;
        }
    }
}